home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / cg.lha / cg / src / c3.puma < prev    next >
Text File  |  1992-11-24  |  14KB  |  482 lines

  1. /* Ich, Doktor Josef Grosch, Informatiker, 23.5.1989 */
  2.  
  3. TRAFO EvalC
  4. TREE Tree
  5. PUBLIC EvalDefC EvalImplC EvalImplHead GenEvaluator
  6.  
  7. EXPORT { VAR Class: Tree.tTree; }
  8.  
  9. GLOBAL {
  10.  
  11. FROM SYSTEM    IMPORT ADR;
  12. FROM IO        IMPORT WriteS, WriteNl;
  13. FROM StringMem    IMPORT Length, WriteString;
  14. FROM Idents    IMPORT tIdent, GetStringRef;
  15. FROM Texts    IMPORT WriteText;
  16. FROM Sets    IMPORT IsElement;
  17. FROM TreeC1    IMPORT BSS;
  18. FROM TreeC2    IMPORT WriteLine;
  19. FROM EvalC3    IMPORT ToBit0;
  20.  
  21. FROM Tree    IMPORT
  22.    NoTree    , tTree        , Child        , ClassCount    ,
  23.    Computed    , Reverse    , Write        , Read        ,
  24.    Inherited    , Synthesized    , Input        , Output    ,
  25.    Stack    , Variable    , NoCodeClass    ,
  26.    CopyDef    , CopyUse    , Thread    , Virtual    , 
  27.    Test        , Left        , Right        ,
  28.    NonBaseComp    , First        , Dummy        , Trace        ,
  29.    Options    , TreeRoot    , iModule    , iMain        ,
  30.    itTree    , ForallClasses    , f        , WI    , WN    ,
  31.    IdentifyClass, IdentifyAttribute, GrammarClass, cOAG        ,
  32.    MaxVisit    ;
  33.  
  34. VAR
  35.    n        : SHORTCARD;
  36.    Node        ,
  37.    Attr        ,
  38.    ChildsClass    : tTree;
  39. }
  40.  
  41. PROCEDURE EvalDefC (t: Tree)
  42.     
  43. Ag (..) :- {
  44.     !# ifndef yy! WI (EvalName); !!
  45.     !# define yy! WI (EvalName); !!
  46.     !!
  47.     !# if defined __STDC__ | defined __cplusplus!
  48.     !# define ARGS(parameters)    parameters!
  49.     !# else!
  50.     !# define ARGS(parameters)    ()!
  51.     !# endif!
  52.     !!
  53.     @# include "@ WI (iMain); @.h"@
  54.     !!
  55.     WriteLine (EvalCodes^.Codes.ImportLine);
  56.     WriteText (f, EvalCodes^.Codes.Import);
  57.     Node := Modules;
  58.     WHILE Node^.Kind = Tree.Module DO
  59.        WriteLine (Node^.Module.EvalCodes^.Codes.ImportLine);
  60.        WriteText (f, Node^.Module.EvalCodes^.Codes.Import);
  61.        Node := Node^.Module.Next;
  62.     END;
  63.     WriteLine (EvalCodes^.Codes.ExportLine);
  64.     WriteText (f, EvalCodes^.Codes.Export);
  65.     Node := Modules;
  66.     WHILE Node^.Kind = Tree.Module DO
  67.        WriteLine (Node^.Module.EvalCodes^.Codes.ExportLine);
  68.        WriteText (f, Node^.Module.EvalCodes^.Codes.Export);
  69.        Node := Node^.Module.Next;
  70.     END;
  71.     !!
  72.     !extern void ! WI (EvalName); ! ARGS((! WI (itTree); ! yyt));!
  73.     !extern void Begin! WI (EvalName); ! ();!
  74.     !extern void Close! WI (EvalName); ! ();!
  75.     !!
  76.     !# endif!
  77. }; .
  78.  
  79. PROCEDURE EvalImplHead (t: Tree)
  80.     
  81. Ag (..) :- {
  82.     !# define DEP(a, b) a!
  83.     !# define SELF yyt!
  84.     @# include "@ WI (EvalName); @.h"@
  85.       IF IsElement (ORD ('Y'), Options) OR
  86.          IsElement (ORD ('Z'), Options) OR
  87.          IsElement (ORD ('L'), Options) THEN
  88.     @# include <stdio.h>@
  89.       END;
  90.       IF IsElement (ORD ('Y'), Options) OR
  91.          IsElement (ORD ('Z'), Options) THEN
  92.     !# ifdef __cplusplus!
  93.     @extern "C" {@
  94.     @# include "Idents.h"@
  95.     @# include "Sets.h"@
  96.     !}!
  97.     !# else!
  98.     @# include "Idents.h"@
  99.     @# include "Sets.h"@
  100.     !# endif!
  101.       END;
  102.       IF IsElement (ORD ('9'), Options) THEN
  103.     !# ifdef __cplusplus!
  104.     @extern "C" {@
  105.     @# include "General.h"@
  106.     !}!
  107.     !# else!
  108.     @# include "General.h"@
  109.     !# endif!
  110.     !!
  111.     !static int xxStack;!
  112.       END;
  113.     WriteLine (EvalCodes^.Codes.GlobalLine);
  114.     WriteText (f, EvalCodes^.Codes.Global);
  115.     Node := Modules;
  116.     WHILE Node^.Kind = Tree.Module DO
  117.        WriteLine (Node^.Module.EvalCodes^.Codes.GlobalLine);
  118.        WriteText (f, Node^.Module.EvalCodes^.Codes.Global);
  119.        Node := Node^.Module.Next;
  120.     END;
  121.     !!
  122.       IF IsElement (ORD ('X'), Options) THEN
  123.     @# include "yy@ WI (iModule); @.w"@
  124.     !# define yyWrite! WI (iMain); !(a) Write! WI (iMain); ! (yyf, a)!
  125.       END;
  126.     !!
  127.     !static char yyb;!
  128.       IF IsElement (ORD ('Y'), Options) OR
  129.          IsElement (ORD ('Z'), Options) THEN
  130.     !!
  131.     !# define yyTrace    true!
  132.     !!
  133.     !static char * yyTypeName [! WN (ClassCount); ! + 1] = { 0,!
  134.     ForallClasses (Classes, TypeName);
  135.     !};!
  136.     !!
  137.     !static void yyWriteType!
  138.     !# if defined __STDC__ | defined __cplusplus!
  139.     ! (! WI (itTree); ! yyt)!
  140.     !# else!
  141.     ! (yyt) ! WI (itTree); ! yyt;!
  142.     !# endif!
  143.     !{!
  144.     ! char * yys = yyTypeName [yyt->Kind];!
  145.     ! register int yyi = 16 - strlen (yys);!
  146.     @ (void) printf ("%s", yys);@
  147.     ! while (yyi -- > 0) (void) putc (' ', stdout);!
  148.     !}!
  149.       END;
  150.       IF IsElement (ORD ('X'), Options) THEN
  151.     !!
  152.     !static FILE * yyf = stdout;!
  153.     !!
  154.     !static void yyWriteHex!
  155.     !# if defined __STDC__ | defined __cplusplus!
  156.     ! (unsigned char * yyx, int yysize)!
  157.     !# else!
  158.     ! (yyx, yysize) unsigned char * yyx; int yysize;!
  159.     !# endif!
  160.     @{ register int yyi; for (yyi = 0; yyi < yysize; yyi ++) (void) printf ("%02x ", yyx [yyi]); }@
  161.     !!
  162.     !static void yyWriteNl () { if (yyTrace) { (void) putc ('\n', stdout); (void) fflush (stdout); } }!
  163.       END;
  164.       IF IsElement (ORD ('X'), Options) THEN
  165.     !!
  166.     !static void yyWriteEval!
  167.     !# if defined __STDC__ | defined __cplusplus!
  168.     ! (! WI (itTree); ! yyt, char * yys)!
  169.     !# else!
  170.     ! (yyt, yys) ! WI (itTree); ! yyt; char * yys;!
  171.     !# endif!
  172.     !{!
  173.     ! if (yyTrace) {!
  174.     !  register int yyi = 24 - strlen (yys);!
  175.     !  yyWriteType (yyt);!
  176.     @  (void) printf (" e %s", yys);@
  177.     !  while (yyi -- > 0) (void) putc (' ', stdout);!
  178.     @  (void) printf (" = ");@
  179.     !  (void) fflush (stdout);!
  180.     ! }!
  181.     !}!
  182.       ELSIF IsElement (ORD ('Y'), Options) THEN
  183.     !!
  184.     !static void yyWriteEval!
  185.     !# if defined __STDC__ | defined __cplusplus!
  186.     ! (! WI (itTree); ! yyt, char * yys)!
  187.     !# else!
  188.     ! (yyt, yys) ! WI (itTree); ! yyt; char * yys;!
  189.     !# endif!
  190.     !{!
  191.     ! if (yyTrace) {!
  192.     !  yyWriteType (yyt);!
  193.     @  (void) printf (" e %s\n", yys);@
  194.     !  (void) fflush (stdout);!
  195.     ! }!
  196.     !}!
  197.       END;
  198.       IF IsElement (ORD ('Z'), Options) THEN
  199.     !!
  200.     !static void yyWriteVisit!
  201.     !# if defined __STDC__ | defined __cplusplus!
  202.     ! (! WI (itTree); ! yyt, char * yys)!
  203.     !# else!
  204.     ! (yyt, yys) ! WI (itTree); ! yyt; char * yys;!
  205.     !# endif!
  206.     !{!
  207.     ! if (yyTrace) {!
  208.     !  yyWriteType (yyt);!
  209.     @  (void) printf (" v %s\n", yys);@
  210.     !  (void) fflush (stdout);!
  211.     ! }!
  212.     !}!
  213.     !!
  214.     !static void yyVisitParent!
  215.     !# if defined __STDC__ | defined __cplusplus!
  216.     ! (! WI (itTree); ! yyt)!
  217.     !# else!
  218.     ! (yyt) ! WI (itTree); ! yyt;!
  219.     !# endif!
  220.     @{ yyWriteVisit (yyt, "parent"); }@
  221.       END;
  222. }; .
  223.  
  224. PROCEDURE EvalImplC (t: Tree)
  225.     
  226. Ag (..) :- {
  227.     EvalImplHead (t);
  228.     !!
  229.     FOR n := 1 TO MaxVisit DO
  230.        !static void yyVisit! WN (n); ! ARGS((register ! WI (itTree); ! yyt));!
  231.     END;
  232.     !!
  233.     !void ! WI (EvalName); !!
  234.     !# if defined __STDC__ | defined __cplusplus!
  235.     ! (! WI (itTree); ! yyt)!
  236.     !# else!
  237.     ! (yyt) ! WI (itTree); ! yyt;!
  238.     !# endif!
  239.       IF NOT IsElement (ORD ('9'), Options) THEN
  240.     !{ ! IF MaxVisit > 0 THEN !yyVisit1 (yyt); ! END; !}!
  241.       ELSE
  242.     !{!
  243.     ! char xxHigh;!
  244.     ! xxStack = 1000000000;!
  245.     IF MaxVisit > 0 THEN
  246.        ! yyVisit1 (yyt);!
  247.     END;
  248.     @ (void) printf ("Stacksize %d\n", (int) & xxHigh - xxStack);@
  249.     !}!
  250.       END;
  251.     !!
  252.     FOR n := 1 TO MaxVisit DO
  253.        !static void yyVisit! WN (n); !!
  254.        !# if defined __STDC__ | defined __cplusplus!
  255.        ! (register ! WI (itTree); ! yyt)!
  256.        !# else!
  257.        ! (yyt) register ! WI (itTree); ! yyt;!
  258.        !# endif!
  259.        !{!
  260.        WriteLine (EvalCodes^.Codes.LocalLine);
  261.        WriteText (f, EvalCodes^.Codes.Local);
  262.        Node := Modules;
  263.        WHILE Node^.Kind = Tree.Module DO
  264.        WriteLine (Node^.Module.EvalCodes^.Codes.LocalLine);
  265.           WriteText (f, Node^.Module.EvalCodes^.Codes.Local);
  266.           Node := Node^.Module.Next;
  267.        END;
  268.       IF IsElement (ORD ('9'), Options) THEN
  269.        ! char xxLow;!
  270.        ! xxStack = Min (xxStack, (int) & xxLow);!
  271.       END;
  272.        !!
  273.        ! switch (yyt->Kind) {!
  274.        IF cOAG IN GrammarClass THEN        (* generate evaluator    *)
  275.           ForallClasses (Classes, GenEvaluator);
  276.        END;
  277.        ! default: ;!
  278.       IF IsElement (ORD ('Z'), Options) THEN
  279.        !  yyVisitParent (yyt);!
  280.       END;
  281.        ! }!
  282.        !}!
  283.        !!
  284.     END;
  285.     !void Begin! WI (EvalName); ! ()!
  286.     !{!
  287.     WriteLine (EvalCodes^.Codes.BeginLine);
  288.     WriteText (f, EvalCodes^.Codes.Begin);
  289.     Node := Modules;
  290.     WHILE Node^.Kind = Tree.Module DO
  291.        WriteLine (Node^.Module.EvalCodes^.Codes.BeginLine);
  292.        WriteText (f, Node^.Module.EvalCodes^.Codes.Begin);
  293.        Node := Node^.Module.Next;
  294.     END;
  295.     !}!
  296.     !!
  297.     !void Close! WI (EvalName); ! ()!
  298.     !{!
  299.     WriteLine (EvalCodes^.Codes.CloseLine);
  300.     WriteText (f, EvalCodes^.Codes.Close);
  301.     Node := Modules;
  302.     WHILE Node^.Kind = Tree.Module DO
  303.        WriteLine (Node^.Module.EvalCodes^.Codes.CloseLine);
  304.        WriteText (f, Node^.Module.EvalCodes^.Codes.Close);
  305.        Node := Node^.Module.Next;
  306.     END;
  307.     !}!
  308. }; .
  309.  
  310.  
  311. PROCEDURE TypeName (t: Tree)
  312.  
  313. Class (..) :-
  314.     NoCodeClass * Properties = {{}};
  315.     Trace IN Properties;
  316.     @"@ WI (Name); @",@
  317.     .
  318.  
  319. PROCEDURE GenEvaluator (t: Tree)
  320.  
  321. Class (..) :-
  322.     NoCodeClass * Properties = {{}};
  323. {    IF (Generated = InstCount) OR (Visits < n) THEN RETURN; END;
  324.     !!
  325.     !case k! WI (Name); !:!
  326.     Class := t;
  327.     LOOP
  328.        IF Generated = InstCount THEN EXIT; END;
  329.        INC (Generated);
  330.        WITH Instance^ [Instance^ [Generated].Order] DO
  331.           IF (Left IN Properties) AND (Attribute^.Child.Partition > n) THEN
  332.              DEC (Generated); EXIT;
  333.           END;
  334.           IF ({Inherited, Right, First} <= Properties) AND NOT (Virtual IN Properties) THEN
  335.       IF IsElement (ORD ('X'), Options) AND (Trace IN t^.Class.Properties) THEN
  336.          @yyWriteEval (yyt, "@ WI (Selector^.Child.Name); !:! WI (Attribute^.Child.Name); @");@
  337.          IF Action # ADR (Action) THEN GenEvaluator (Action); END; !!
  338.          IF (Attribute^.Kind = Tree.Child) OR (Attribute^.Attribute.Type = itTree) THEN
  339.             !write! WI (itTree);
  340.             ! (yyt->! WI (Name); !.! WI (Selector^.Child.Name);
  341.             !->! WI (Selector^.Child.Type); !.! WI (Attribute^.Child.Name); !)!
  342.          ELSE
  343.             !write! WI (Attribute^.Child.Type);
  344.             ! (yyt->! WI (Name); !.! WI (Selector^.Child.Name);
  345.             !->! WI (Selector^.Child.Type); !.! WI (Attribute^.Child.Name); !) yyWriteNl ();!
  346.          END;
  347.       ELSIF IsElement (ORD ('Y'), Options) AND (Trace IN t^.Class.Properties) THEN
  348.          @yyWriteEval (yyt, "@ WI (Selector^.Child.Name); !:! WI (Attribute^.Child.Name); @");@
  349.          IF Action # ADR (Action) THEN GenEvaluator (Action); END;
  350.       ELSE
  351.          IF Action # ADR (Action) THEN GenEvaluator (Action); END;
  352.       END;
  353.           END;
  354.           IF ({Synthesized, Left, First} <= Properties) AND ({Dummy, Virtual} * Properties = {}) THEN
  355.       IF IsElement (ORD ('X'), Options) AND (Trace IN t^.Class.Properties) THEN
  356.          @yyWriteEval (yyt, "@ WI (Attribute^.Child.Name); @");@
  357.          IF Action # ADR (Action) THEN GenEvaluator (Action); END; !!
  358.          IF Test IN Properties THEN
  359.             !writebool (yyb) yyWriteNl ();!
  360.          ELSIF (Attribute^.Kind = Tree.Child) OR (Attribute^.Attribute.Type = itTree) THEN
  361.             !write! WI (itTree);
  362.             ! (yyt->! WI (Name); !.! WI (Attribute^.Child.Name); !)! 
  363.          ELSE
  364.             !write! WI (Attribute^.Child.Type);
  365.             ! (yyt->! WI (Name); !.! WI (Attribute^.Child.Name); !) yyWriteNl ();!
  366.          END;
  367.       ELSIF IsElement (ORD ('Y'), Options) AND (Trace IN t^.Class.Properties) THEN
  368.          @yyWriteEval (yyt, "@ WI (Attribute^.Child.Name); @");@
  369.          IF Action # ADR (Action) THEN GenEvaluator (Action); END;
  370.       ELSE
  371.          IF Action # ADR (Action) THEN GenEvaluator (Action); END;
  372.       END;
  373.           END;
  374.           IF ({Synthesized, Right, First} <= Properties) AND
  375.          (Attribute^.Child.Partition <= Selector^.Child.Class^.Class.Visits) THEN
  376.       IF IsElement (ORD ('Z'), Options) AND (Trace IN t^.Class.Properties) THEN
  377.          @yyWriteVisit (yyt, "@ WI (Selector^.Child.Name); ! ! 
  378.          WN (Attribute^.Child.Partition); @");@
  379.       END;
  380.          !yyVisit! WN (Attribute^.Child.Partition);
  381.          ! (yyt->! WI (Name); !.! WI (Selector^.Child.Name); !);!
  382.           END;
  383.        END;
  384.     END;
  385.       IF IsElement (ORD ('Z'), Options) AND (Trace IN t^.Class.Properties) THEN
  386.     !yyVisitParent (yyt);!
  387.       END;
  388.     !break;!
  389. }; .
  390. Assign (..) :- {
  391.     WriteLine (Pos);
  392.     GenEvaluator (Results); !=! GenEvaluator (Arguments); !;!
  393. }; .
  394. Copy (..) :- {
  395.     WriteLine (Pos);
  396.     GenEvaluator (Results); !=! GenEvaluator (Arguments); !;!
  397. }; .
  398. TargetCode (..) :- {
  399.     WriteLine (Pos);
  400.     GenEvaluator (Code); !!
  401. }; .
  402. Check (..) :- {
  403.     WriteLine (Pos);
  404.     IF Condition # NoTree THEN
  405.        @if (! (@ 
  406.       IF IsElement (ORD ('X'), Options) THEN
  407.        !yyb = ! 
  408.       END;
  409.        GenEvaluator (Condition); !)) {! GenEvaluator (Statement); !; }!
  410.        IF Actions^.Kind = Tree.Check THEN
  411.           !else!
  412.           GenEvaluator (Actions);
  413.        END;
  414.     ELSE
  415.       IF IsElement (ORD ('X'), Options) THEN
  416.        !yyb = false; ! 
  417.       END;
  418.        GenEvaluator (Statement); !;!
  419.        GenEvaluator (Actions);
  420.     END;
  421. }; .
  422. Designator (..) :- {
  423.     Attr := IdentifyAttribute (Class, Selector);
  424.     IF Attr # NoTree THEN
  425.        ChildsClass := Attr^.Child.Class;
  426.        Attr := IdentifyAttribute (ChildsClass, Attribute);
  427.        IF NOT (Virtual IN Attr^.Attribute.Properties) THEN
  428.           !yyt->! WI (Class^.Class.Name); !.! WI (Selector); !->! 
  429.           WI (ChildsClass^.Class.Name); !.! WI (Attribute);
  430.        END;
  431.     ELSE
  432.        WI (Selector); !:! WI (Attribute);
  433.     END;
  434.     GenEvaluator (Next);
  435. }; .
  436. Ident (..) :- {
  437.     Attr := IdentifyAttribute (Class, Attribute);
  438.     IF Attr # NoTree THEN
  439.        IF NOT (Virtual IN Attr^.Attribute.Properties) THEN
  440.           !yyt->! WI (Class^.Class.Name); !.! WI (Attribute);
  441.        END;
  442.     ELSE
  443.        WI (Attribute);
  444.     END;
  445.     GenEvaluator (Next);
  446. }; .
  447. Remote (..) :-
  448.    TheClass: Class; k: INTEGER;
  449.    TheClass := IdentifyClass (TreeRoot^.Ag.Classes, Type);
  450. {  IF TheClass # NoTree THEN
  451.       Attr := IdentifyAttribute (TheClass, Attribute);
  452.       IF Attr # NoTree THEN
  453.      WITH Attr^.Attribute DO
  454.         k := ToBit0 (TheClass, AttrIndex);
  455.         IF Synthesized IN Properties THEN
  456.            !REMOTE_SYN (yyIsComp! WN (k DIV BSS); !, ! WN (k MOD BSS); !, yyS! WN (k); !, ! 
  457.            GenEvaluator (Designators); !, ! WI (t^.Remote.Type); !, ! WI (Attribute); !)! 
  458.         ELSIF Inherited IN Properties THEN
  459.            !REMOTE_INH (yyIsComp! WN (k DIV BSS); !, ! WN (k MOD BSS); !, ! WN (k); !, ! 
  460.            GenEvaluator (Designators); !, ! WI (t^.Remote.Type); !, ! WI (Attribute); !)! 
  461.         ELSE
  462.            GenEvaluator (Designators); !->! WI (t^.Remote.Type); !.! WI (Attribute);
  463.         END;
  464.      END;
  465.       END;
  466.    END;
  467.    GenEvaluator (Next);
  468. }; .
  469. Any (..) :- {
  470.     WriteString (f, Code);
  471.     GenEvaluator (Next);
  472. }; .
  473. Anys (..) :- {
  474.     GenEvaluator (Layouts);
  475.     GenEvaluator (Next);
  476. }; .
  477. LayoutAny (..) :- {
  478.     WriteString (f, Code);
  479.     GenEvaluator (Next);
  480. }; .
  481.  
  482.